<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // js有基本数据类型  和 复杂数据类型(引用数据类型)
        //   字符串               对象 
        //   数值                 数组
        //   布尔                 函数
        //   undefined            正则 
        //   null 

        // 1.typeof  
        // typeof 返回值是一个单词 
        // 缺点:只能准确判断字符串  数值  布尔 undefined 
        //      复杂数据类型得到的结果是  'object'

        // 2. instanceof
        //     返回值是个布尔类型 
        //     只能判断复杂数据类型 
        //   语法: 数据 instanceof 内置构造函数
        //         [1,2,3] instanceof Array
        // 缺点: 不能判断基本数据类型 


        // 3.constructor 
        //  语法:  数据结构.constructor
        //  结果:  该数据结构数组的构造函数 
        // 缺点: null  undefined 测不出来  


        // 4. Object.prototype.toString.call
        // 语法: Object.prototype.toString.call(你要判断的数据结构)
        // 返回值: '[object 数据类型]'
        // 可以准确判断所有数据类型

        // 美中不足 结果藏得比较深 


        //5. Array.isArray()
        // 只能判断数组 不能判断其它数据类型 


        // 6. isNaN() 
        // 判断是否是数值 
        // 如果不是数值  true 
        // 如果是数值  false 
        // typeof 
        // console.log(typeof 123); // 'number'
        // console.log(typeof '123');// 'string'
        // console.log(typeof true); // 'boolean'
        // console.log(typeof undefined); // 'undefined'
        // console.log(typeof null); // 'object'  null 一个特殊的对象 
        // console.log(typeof [1,2,3]) // 'object'
        // console.log(typeof {name:'zhagnsan'})// 'object'


        // instanceof  
        // console.log([1,2,3] instanceof Array); // [1,2,3] 是否是数组 true
        // console.log({name:'张三'} instanceof Array);//{name:'张三'}是否是数组 false
        // console.log({name:'张三'} instanceof Object); // true
        // console.log([1,2,3] instanceof Object);//true


        // constructor 

        // function Person(name){
        //     this.name = name
        // }

        // const p = new Person('张三');

        // console.log(p.constructor);
        // /* Person(name){
        //     this.name = name
        // } */
        // console.log([].constructor);
        // // Array() { [native code] }
        // console.log(function(){}.constructor);
        // // Function() { [native code] }
        // console.log({}.constructor);
        // // Object() { [native code] }
        // console.log(/^12$/.constructor);
        // console.log({}.constructor);
        //Object() { [native code] }

        // 应用场景 
        // if(/^12$/.constructor === RegExp){
        //     alert(123);
        // }else{
        //     alert(456)
        // }


        // if([].constructor === Array){
        //     alert(123);
        // }else{
        //     alert(456)
        // }



        

        // 为什么 constructor能拿到构造函数 


        
        // function Person(name){
        //     this.name = name
        // }

        // const p = new Person('张三');

        // console.log(p);

        // 每个对象有个属性 叫 constructor 
        //  这个constructor  就是原型对象 
        // 构造函数的prototype指向这个原型对象  


        // 我们访问 p.constructor得到这个原型对象 

        // 只有Person的实例的__proto__ 才会指向 Person.prototype 
        // 
        // Person.prototype 指向 原型对象  
        // 所以 p 就是 Person的一个实例  
        // console.log(p.constructor); // 得到是构造函数 Person 
            // if(p.constructor === Person){
            //     alert(123)
            // }
            // else{
            //     alert(456)
            // }

            //p是person的一个实例 


            // Object.prototype.toString.call() 

            // console.log(Object.prototype.toString.call({}));//[object Object]
            // console.log(Object.prototype.toString.call([]));//[object Array]
            // console.log(Object.prototype.toString.call(123));//[object Number]
            // console.log(Object.prototype.toString.call('123'));//[object String]
            // console.log(Object.prototype.toStr.call(true));//[object Boolean]ing
            // console.log(Object.prototype.toString.call(undefined));//[object Boolean]
            // console.log(Object.prototype.toString.call(null));//[object Null]
            // console.log(Object.prototype.toString.call(new Date()));//[object Date]
            // console.log(Object.prototype.toString.call(/123/));//[object RegExp]
            // console.log(Object.prototype.toString.call(function(){}));//[object Function]
            // console.log(Object.prototype.toString.call(function(){}) === '[object Function]');



            // console.log(Object.prototype.toString.call(function(){}).match(/^\[object (.*?)\]$/)[1])


            // Array.isArray();

            // console.log(Array.isArray([1,2,3]))
            // console.log(Array.isArray({name:'zhangsan'}))



            // isNaN()
            // console.log(isNaN([1,2,3]))//true 数组不是数值
            // console.log(isNaN(666)) //false 




    </script>
</body>
</html>